package com.ppt.android.base.utils

import android.content.Context
import android.content.pm.PackageInfo
import android.os.Build
import android.util.DisplayMetrics
import android.view.WindowManager
import com.ppt.android.base.BaseApplication
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.io.InputStream
import java.math.BigDecimal

/**
 * App 相关工具类
 *
 * @author ZouJiaCai
 * @sine 2023/2/13 23:15
 */
object AppUtils {

    /**
     * 获取当前 App 版本号
     *
     * @return Long
     */
    fun getAppVersionCode(): Long {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            getAppPackageInfo().longVersionCode
        } else {
            getAppPackageInfo().versionCode.toLong()
        }
    }

    /**
     * 获取当前 App 版本名
     *
     * @return String
     */
    fun getAppVersionName(): String? = getAppPackageInfo().versionName

    /**
     * 获取当前 App 的 [PackageInfo]
     *
     * @return PackageInfo
     */
    fun getAppPackageInfo(): PackageInfo {
        return BaseApplication.context
            .packageManager
            .getPackageInfo(BaseApplication.context.packageName, 0)
    }

    fun formatDouble(value: Double): String {
        return if (BigDecimal(value).scale() > 0) {
            value.toString()
        } else {
            value.toInt().toString()
        }
    }

    fun getNavigationBarHeight(context: Context): Int {
        val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        val display = windowManager.defaultDisplay
        val realDisplayMetrics = DisplayMetrics()
        display.getRealMetrics(realDisplayMetrics)

        val realHeight = realDisplayMetrics.heightPixels
        val realWidth = realDisplayMetrics.widthPixels

        val displayMetrics = DisplayMetrics()
        display.getMetrics(displayMetrics)

        val displayHeight = displayMetrics.heightPixels
        val displayWidth = displayMetrics.widthPixels

        // 导航栏可能在底部或右侧（横屏时）
        return if (realWidth - displayWidth > 0) {
            realWidth - displayWidth
        } else if (realHeight - displayHeight > 0) {
            realHeight - displayHeight
        } else {
            0
        }
    }

    fun copyAssetToFile(context: Context, assetFileName: String): File? {
        val file = File(context.cacheDir, assetFileName) // 在缓存目录创建文件
        return try {
            // 获取 assets 中的文件输入流
            val inputStream: InputStream = context.assets.open(assetFileName)
            // 创建文件输出流
            val outputStream = FileOutputStream(file)

            // 复制文件内容
            inputStream.use { input ->
                outputStream.use { output ->
                    input.copyTo(output)
                }
            }

            file // 返回创建的 File 对象
        } catch (e: IOException) {
            e.printStackTrace()
            null // 发生错误时返回 null
        }
    }
}